package com.omni.monitor.model.threadpool;

import lombok.Data;

/**
 * 线程池统计信息（补充空闲线程、平均执行时间等字段）
 */
@Data
public class ThreadPoolStats {
    private long timestamp;
    private String poolName;
    private int activeThreads;
    private int corePoolSize;
    private int maximumPoolSize;
    private int largestPoolSize;
    private int poolSize;
    // 新增：空闲线程数（总线程数-活跃线程数）
    private int idleThreads=0;
    private int queueSize;
    private int queueCapacity;
    // 新增：队列剩余容量
    private int remainingQueueCapacity;
    private long taskCount;
    private long completedTaskCount;
    private long rejectedCount=0;
    // 新增：平均任务执行时间（毫秒）
    private double avgTaskExecuteTime;
    // 计算的指标

    /**
     *  活跃线程比例（%）
     */
    private double activeThreadRatio=0.0;
    /**
     * 队列使用率（%）
     */
    private double queueUsageRatio=0.0;
    /**
     * 任务完成率（%）
     */
    private double taskCompletionRatio=0.0;



    // 1. 修复派生字段计算：添加非法值兜底
    public void calculateDerivedFields() {
        // 空闲线程数：确保非负（避免线程数为负的异常情况）
        this.idleThreads = Math.max(0, this.poolSize - this.activeThreads);
        // 剩余队列容量：确保非负
        this.remainingQueueCapacity = Math.max(0, this.queueCapacity - this.queueSize);
    }

    // 2. 修复核心指标计算：避免分母为0导致的NaN
    public void calculateMetrics() {
        // 活跃线程比例：maximumPoolSize为0时兜底0.0（避免NaN）
        this.activeThreadRatio = (this.maximumPoolSize > 0)
                ? (double) this.activeThreads / this.maximumPoolSize * 100
                : 0.0;

        // 队列使用率：queueCapacity为0（无界队列）时兜底0.0
        this.queueUsageRatio = (this.queueCapacity > 0 && this.queueCapacity != Integer.MAX_VALUE)
                ? (double) this.queueSize / this.queueCapacity * 100
                : 0.0;

        // 任务完成率：taskCount为0时兜底100%（避免NaN）
        this.taskCompletionRatio = (this.taskCount > 0)
                ? (double) this.completedTaskCount / this.taskCount * 100
                : 100.0;

        // 兜底：确保所有比例值在0-100之间（避免异常值，如超过100%）
        this.activeThreadRatio = Math.max(0.0, Math.min(100.0, this.activeThreadRatio));
        this.queueUsageRatio = Math.max(0.0, Math.min(100.0, this.queueUsageRatio));
        this.taskCompletionRatio = Math.max(0.0, Math.min(100.0, this.taskCompletionRatio));
    }
}